From fcada522913e5e07efa6367eff87ace9f06d24c8 Mon Sep 17 00:00:00 2001
From: Akira TAGOH <akira@tagoh.org>
Date: Wed, 28 Aug 2019 17:46:03 +0900
Subject: [PATCH] Do not return FcFalse from FcConfigParseAndLoad*() if
 complain is set to false

https://bugzilla.redhat.com/show_bug.cgi?id=1744377
---
 src/fcxml.c           |  8 ++++---
 test/Makefile.am      |  4 ++++
 test/test-bz1744377.c | 51 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 3 deletions(-)
 create mode 100644 test/test-bz1744377.c

diff --git a/src/fcxml.c b/src/fcxml.c
index 2e26e77a..076fa301 100644
--- a/src/fcxml.c
+++ b/src/fcxml.c
@@ -3526,7 +3526,7 @@ _FcConfigParse (FcConfig	*config,
     int		    len;
     FcStrBuf	    sbuf;
     char            buf[BUFSIZ];
-    FcBool	    ret = FcFalse;
+    FcBool	    ret = FcFalse, complain_again = complain;
 
 #ifdef _WIN32
     if (!pGetSystemWindowsDirectory)
@@ -3605,7 +3605,7 @@ _FcConfigParse (FcConfig	*config,
     close (fd);
 
     ret = FcConfigParseAndLoadFromMemoryInternal (config, filename, FcStrBufDoneStatic (&sbuf), complain, load);
-    complain = FcFalse; /* no need to reclaim here */
+    complain_again = FcFalse; /* no need to reclaim here */
 bail1:
     FcStrBufDestroy (&sbuf);
 bail0:
@@ -3613,7 +3613,9 @@ bail0:
 	FcStrFree (filename);
     if (realfilename)
 	FcStrFree (realfilename);
-    if (!ret && complain)
+    if (!complain)
+	return FcTrue;
+    if (!ret && complain_again)
     {
 	if (name)
 	    FcConfigMessage (0, FcSevereError, "Cannot %s config file \"%s\"", load ? "load" : "scan", name);
diff --git a/test/Makefile.am b/test/Makefile.am
index f9c21581..a9fa089a 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -131,6 +131,10 @@ TESTS += test-d1f48f11
 endif
 endif
 
+check_PROGRAMS += test-bz1744377
+test_bz1744377_LDADD = $(top_builddir)/src/libfontconfig.la
+TESTS += test-bz1744377
+
 EXTRA_DIST=run-test.sh run-test-conf.sh $(LOG_COMPILER) $(TESTDATA) out.expected-long-family-names out.expected-no-long-family-names
 
 CLEANFILES=out out1 out2 fonts.conf out.expected
diff --git a/test/test-bz1744377.c b/test/test-bz1744377.c
new file mode 100644
index 00000000..d7f10535
--- /dev/null
+++ b/test/test-bz1744377.c
@@ -0,0 +1,51 @@
+/*
+ * fontconfig/test/test-bz1744377.c
+ *
+ * Copyright © 2000 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the author(s) not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission.  The authors make no
+ * representations about the suitability of this software for any purpose.  It
+ * is provided "as is" without express or implied warranty.
+ *
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <fontconfig/fontconfig.h>
+
+int
+main (void)
+{
+    const FcChar8 *doc = ""
+	"<fontconfig>\n"
+	"  <include ignore_missing=\"yes\">blahblahblah</include>\n"
+	"</fontconfig>\n"
+	"";
+    const FcChar8 *doc2 = ""
+	"<fontconfig>\n"
+	"  <include ignore_missing=\"no\">blahblahblah</include>\n"
+	"</fontconfig>\n"
+	"";
+    FcConfig *cfg = FcConfigCreate ();
+
+    if (!FcConfigParseAndLoadFromMemory (cfg, doc, FcTrue))
+	return 1;
+    if (FcConfigParseAndLoadFromMemory (cfg, doc2, FcTrue))
+	return 1;
+    if (!FcConfigParseAndLoadFromMemory (cfg, doc2, FcFalse))
+	return 1;
+
+    FcConfigDestroy (cfg);
+
+    return 0;
+}
-- 
2.23.0

